{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 适当的特征工程（20分）\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:08:25.713970Z",
     "start_time": "2020-06-30T15:08:22.265229Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "步骤：\n",
    "1.读取数据后首先查看一下数据的基本情况\n",
    "2.对于数据型特征，可以用describ查看一下它的基本统计量；对于类别型特征，需要绘制直方图，查看不同的取值对应的样本数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:08:26.321342Z",
     "start_time": "2020-06-30T15:08:25.714932Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\IPython\\core\\interactiveshell.py:2785: DtypeWarning: Columns (12,18) have mixed types. Specify dtype option on import or set low_memory=False.\n",
      "  interactivity=interactivity, compiler=compiler, result=result)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ID</th>\n",
       "      <th>Gender</th>\n",
       "      <th>City</th>\n",
       "      <th>Monthly_Income</th>\n",
       "      <th>DOB</th>\n",
       "      <th>Lead_Creation_Date</th>\n",
       "      <th>Loan_Amount_Applied</th>\n",
       "      <th>Loan_Tenure_Applied</th>\n",
       "      <th>Existing_EMI</th>\n",
       "      <th>Employer_Name</th>\n",
       "      <th>...</th>\n",
       "      <th>Interest_Rate</th>\n",
       "      <th>Processing_Fee</th>\n",
       "      <th>EMI_Loan_Submitted</th>\n",
       "      <th>Filled_Form</th>\n",
       "      <th>Device_Type</th>\n",
       "      <th>Var2</th>\n",
       "      <th>Source</th>\n",
       "      <th>Var4</th>\n",
       "      <th>LoggedIn</th>\n",
       "      <th>Disbursed</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>ID000002C20</td>\n",
       "      <td>Female</td>\n",
       "      <td>Delhi</td>\n",
       "      <td>20000</td>\n",
       "      <td>23-May-78</td>\n",
       "      <td>15-May-15</td>\n",
       "      <td>300000.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>CYBOSOL</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>N</td>\n",
       "      <td>Web-browser</td>\n",
       "      <td>G</td>\n",
       "      <td>S122</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>ID000004E40</td>\n",
       "      <td>Male</td>\n",
       "      <td>Mumbai</td>\n",
       "      <td>35000</td>\n",
       "      <td>7-Oct-85</td>\n",
       "      <td>4-May-15</td>\n",
       "      <td>200000.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>TATA CONSULTANCY SERVICES LTD (TCS)</td>\n",
       "      <td>...</td>\n",
       "      <td>13.25</td>\n",
       "      <td>NaN</td>\n",
       "      <td>6762.9</td>\n",
       "      <td>N</td>\n",
       "      <td>Web-browser</td>\n",
       "      <td>G</td>\n",
       "      <td>S122</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>ID000007H20</td>\n",
       "      <td>Male</td>\n",
       "      <td>Panchkula</td>\n",
       "      <td>22500</td>\n",
       "      <td>10-Oct-81</td>\n",
       "      <td>19-May-15</td>\n",
       "      <td>600000.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>ALCHEMIST HOSPITALS LTD</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>N</td>\n",
       "      <td>Web-browser</td>\n",
       "      <td>B</td>\n",
       "      <td>S143</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>ID000008I30</td>\n",
       "      <td>Male</td>\n",
       "      <td>Saharsa</td>\n",
       "      <td>35000</td>\n",
       "      <td>30-Nov-87</td>\n",
       "      <td>9-May-15</td>\n",
       "      <td>1000000.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>BIHAR GOVERNMENT</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>N</td>\n",
       "      <td>Web-browser</td>\n",
       "      <td>B</td>\n",
       "      <td>S143</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>ID000009J40</td>\n",
       "      <td>Male</td>\n",
       "      <td>Bengaluru</td>\n",
       "      <td>100000</td>\n",
       "      <td>17-Feb-84</td>\n",
       "      <td>20-May-15</td>\n",
       "      <td>500000.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>25000.0</td>\n",
       "      <td>GLOBAL EDGE SOFTWARE</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>N</td>\n",
       "      <td>Web-browser</td>\n",
       "      <td>B</td>\n",
       "      <td>S134</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 26 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            ID  Gender       City  Monthly_Income        DOB  \\\n",
       "0  ID000002C20  Female      Delhi           20000  23-May-78   \n",
       "1  ID000004E40    Male     Mumbai           35000   7-Oct-85   \n",
       "2  ID000007H20    Male  Panchkula           22500  10-Oct-81   \n",
       "3  ID000008I30    Male    Saharsa           35000  30-Nov-87   \n",
       "4  ID000009J40    Male  Bengaluru          100000  17-Feb-84   \n",
       "\n",
       "  Lead_Creation_Date  Loan_Amount_Applied  Loan_Tenure_Applied  Existing_EMI  \\\n",
       "0          15-May-15             300000.0                  5.0           0.0   \n",
       "1           4-May-15             200000.0                  2.0           0.0   \n",
       "2          19-May-15             600000.0                  4.0           0.0   \n",
       "3           9-May-15            1000000.0                  5.0           0.0   \n",
       "4          20-May-15             500000.0                  2.0       25000.0   \n",
       "\n",
       "                         Employer_Name    ...    Interest_Rate Processing_Fee  \\\n",
       "0                              CYBOSOL    ...              NaN            NaN   \n",
       "1  TATA CONSULTANCY SERVICES LTD (TCS)    ...            13.25            NaN   \n",
       "2              ALCHEMIST HOSPITALS LTD    ...              NaN            NaN   \n",
       "3                     BIHAR GOVERNMENT    ...              NaN            NaN   \n",
       "4                 GLOBAL EDGE SOFTWARE    ...              NaN            NaN   \n",
       "\n",
       "  EMI_Loan_Submitted Filled_Form  Device_Type  Var2  Source  Var4 LoggedIn  \\\n",
       "0                NaN           N  Web-browser     G    S122     1        0   \n",
       "1             6762.9           N  Web-browser     G    S122     3        0   \n",
       "2                NaN           N  Web-browser     B    S143     1        0   \n",
       "3                NaN           N  Web-browser     B    S143     3        0   \n",
       "4                NaN           N  Web-browser     B    S134     3        1   \n",
       "\n",
       "  Disbursed  \n",
       "0       0.0  \n",
       "1       0.0  \n",
       "2       0.0  \n",
       "3       0.0  \n",
       "4       0.0  \n",
       "\n",
       "[5 rows x 26 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train = pd.read_csv('Train.csv')\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据探索"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "注：在读取文件时，报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte<br>\n",
    "问题出在你读取的文件不是‘utf - 8’编码的，解决办法是将.csv文件打开后另存为‘utf-8’编码的.csv文件<br>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:08:26.618517Z",
     "start_time": "2020-06-30T15:08:26.322309Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ID</th>\n",
       "      <th>Gender</th>\n",
       "      <th>City</th>\n",
       "      <th>Monthly_Income</th>\n",
       "      <th>DOB</th>\n",
       "      <th>Lead_Creation_Date</th>\n",
       "      <th>Loan_Amount_Applied</th>\n",
       "      <th>Loan_Tenure_Applied</th>\n",
       "      <th>Existing_EMI</th>\n",
       "      <th>Employer_Name</th>\n",
       "      <th>...</th>\n",
       "      <th>Loan_Amount_Submitted</th>\n",
       "      <th>Loan_Tenure_Submitted</th>\n",
       "      <th>Interest_Rate</th>\n",
       "      <th>Processing_Fee</th>\n",
       "      <th>EMI_Loan_Submitted</th>\n",
       "      <th>Filled_Form</th>\n",
       "      <th>Device_Type</th>\n",
       "      <th>Var2</th>\n",
       "      <th>Source</th>\n",
       "      <th>Var4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>ID000026A10</td>\n",
       "      <td>Male</td>\n",
       "      <td>Dehradun</td>\n",
       "      <td>21500</td>\n",
       "      <td>3-Apr-87</td>\n",
       "      <td>5-May-15</td>\n",
       "      <td>100000.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>APTARA INC</td>\n",
       "      <td>...</td>\n",
       "      <td>100000.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>20.0</td>\n",
       "      <td>1000.0</td>\n",
       "      <td>2649.39</td>\n",
       "      <td>N</td>\n",
       "      <td>Web-browser</td>\n",
       "      <td>B</td>\n",
       "      <td>S122</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>ID000054C40</td>\n",
       "      <td>Male</td>\n",
       "      <td>Mumbai</td>\n",
       "      <td>42000</td>\n",
       "      <td>12-May-80</td>\n",
       "      <td>1-May-15</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>ATUL LTD</td>\n",
       "      <td>...</td>\n",
       "      <td>690000.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>24.0</td>\n",
       "      <td>13800.0</td>\n",
       "      <td>19849.90</td>\n",
       "      <td>Y</td>\n",
       "      <td>Mobile</td>\n",
       "      <td>C</td>\n",
       "      <td>S133</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>ID000066O10</td>\n",
       "      <td>Female</td>\n",
       "      <td>Jaipur</td>\n",
       "      <td>10000</td>\n",
       "      <td>19-Sep-89</td>\n",
       "      <td>1-May-15</td>\n",
       "      <td>300000.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>SHAREKHAN PVT LTD</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>N</td>\n",
       "      <td>Web-browser</td>\n",
       "      <td>B</td>\n",
       "      <td>S133</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>ID000110G00</td>\n",
       "      <td>Female</td>\n",
       "      <td>Chennai</td>\n",
       "      <td>14650</td>\n",
       "      <td>15-Aug-91</td>\n",
       "      <td>1-May-15</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>MAERSK GLOBAL SERVICE CENTRES</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>N</td>\n",
       "      <td>Mobile</td>\n",
       "      <td>C</td>\n",
       "      <td>S133</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>ID000113J30</td>\n",
       "      <td>Male</td>\n",
       "      <td>Chennai</td>\n",
       "      <td>23400</td>\n",
       "      <td>22-Jul-87</td>\n",
       "      <td>1-May-15</td>\n",
       "      <td>100000.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>5000.0</td>\n",
       "      <td>SCHAWK</td>\n",
       "      <td>...</td>\n",
       "      <td>100000.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>N</td>\n",
       "      <td>Web-browser</td>\n",
       "      <td>B</td>\n",
       "      <td>S143</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 24 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            ID  Gender      City  Monthly_Income        DOB  \\\n",
       "0  ID000026A10    Male  Dehradun           21500   3-Apr-87   \n",
       "1  ID000054C40    Male    Mumbai           42000  12-May-80   \n",
       "2  ID000066O10  Female    Jaipur           10000  19-Sep-89   \n",
       "3  ID000110G00  Female   Chennai           14650  15-Aug-91   \n",
       "4  ID000113J30    Male   Chennai           23400  22-Jul-87   \n",
       "\n",
       "  Lead_Creation_Date  Loan_Amount_Applied  Loan_Tenure_Applied  Existing_EMI  \\\n",
       "0           5-May-15             100000.0                  3.0           0.0   \n",
       "1           1-May-15                  0.0                  0.0           0.0   \n",
       "2           1-May-15             300000.0                  2.0           0.0   \n",
       "3           1-May-15                  0.0                  0.0           0.0   \n",
       "4           1-May-15             100000.0                  1.0        5000.0   \n",
       "\n",
       "                   Employer_Name ...  Loan_Amount_Submitted  \\\n",
       "0                     APTARA INC ...               100000.0   \n",
       "1                       ATUL LTD ...               690000.0   \n",
       "2              SHAREKHAN PVT LTD ...                    NaN   \n",
       "3  MAERSK GLOBAL SERVICE CENTRES ...                    NaN   \n",
       "4                         SCHAWK ...               100000.0   \n",
       "\n",
       "  Loan_Tenure_Submitted  Interest_Rate Processing_Fee  EMI_Loan_Submitted  \\\n",
       "0                   3.0           20.0         1000.0             2649.39   \n",
       "1                   5.0           24.0        13800.0            19849.90   \n",
       "2                   NaN            NaN            NaN                 NaN   \n",
       "3                   NaN            NaN            NaN                 NaN   \n",
       "4                   2.0            NaN            NaN                 NaN   \n",
       "\n",
       "   Filled_Form  Device_Type  Var2  Source Var4  \n",
       "0            N  Web-browser     B    S122    3  \n",
       "1            Y       Mobile     C    S133    5  \n",
       "2            N  Web-browser     B    S133    1  \n",
       "3            N       Mobile     C    S133    1  \n",
       "4            N  Web-browser     B    S143    1  \n",
       "\n",
       "[5 rows x 24 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test = pd.read_csv(\"Test.csv\")\n",
    "test.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:08:26.624501Z",
     "start_time": "2020-06-30T15:08:26.619516Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(87020, 26)\n",
      "(37717, 24)\n"
     ]
    }
   ],
   "source": [
    "print(train.shape)\n",
    "print(test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 查案数据的结构"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:08:26.705348Z",
     "start_time": "2020-06-30T15:08:26.626496Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 87020 entries, 0 to 87019\n",
      "Data columns (total 26 columns):\n",
      "ID                       87020 non-null object\n",
      "Gender                   87020 non-null object\n",
      "City                     86017 non-null object\n",
      "Monthly_Income           87020 non-null int64\n",
      "DOB                      87020 non-null object\n",
      "Lead_Creation_Date       87020 non-null object\n",
      "Loan_Amount_Applied      86949 non-null float64\n",
      "Loan_Tenure_Applied      86949 non-null float64\n",
      "Existing_EMI             86949 non-null float64\n",
      "Employer_Name            86949 non-null object\n",
      "Salary_Account           75256 non-null object\n",
      "Mobile_Verified          87020 non-null object\n",
      "Var5                     87020 non-null object\n",
      "Var1                     87019 non-null object\n",
      "Loan_Amount_Submitted    52407 non-null float64\n",
      "Loan_Tenure_Submitted    52407 non-null float64\n",
      "Interest_Rate            27726 non-null float64\n",
      "Processing_Fee           27420 non-null float64\n",
      "EMI_Loan_Submitted       27727 non-null object\n",
      "Filled_Form              87020 non-null object\n",
      "Device_Type              87020 non-null object\n",
      "Var2                     87020 non-null object\n",
      "Source                   87020 non-null object\n",
      "Var4                     87020 non-null int64\n",
      "LoggedIn                 87020 non-null int64\n",
      "Disbursed                87019 non-null float64\n",
      "dtypes: float64(8), int64(3), object(15)\n",
      "memory usage: 17.3+ MB\n"
     ]
    }
   ],
   "source": [
    "train.info()#查案数据的结构，看是否有缺省值"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 查看target的分布"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:08:27.048367Z",
     "start_time": "2020-06-30T15:08:26.707320Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0,0.5,'Number of occurrences')"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.countplot(train['Disbursed'])\n",
    "plt.xlabel('Disbured')\n",
    "plt.ylabel('Number of occurrences')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 查看数值型特征的分布"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:08:27.144111Z",
     "start_time": "2020-06-30T15:08:27.049364Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Monthly_Income</th>\n",
       "      <th>Loan_Amount_Applied</th>\n",
       "      <th>Loan_Tenure_Applied</th>\n",
       "      <th>Existing_EMI</th>\n",
       "      <th>Loan_Amount_Submitted</th>\n",
       "      <th>Loan_Tenure_Submitted</th>\n",
       "      <th>Interest_Rate</th>\n",
       "      <th>Processing_Fee</th>\n",
       "      <th>Var4</th>\n",
       "      <th>LoggedIn</th>\n",
       "      <th>Disbursed</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>8.702000e+04</td>\n",
       "      <td>8.694900e+04</td>\n",
       "      <td>86949.000000</td>\n",
       "      <td>8.694900e+04</td>\n",
       "      <td>5.240700e+04</td>\n",
       "      <td>52407.000000</td>\n",
       "      <td>27726.000000</td>\n",
       "      <td>27420.000000</td>\n",
       "      <td>87020.000000</td>\n",
       "      <td>87020.000000</td>\n",
       "      <td>87019.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>5.884997e+04</td>\n",
       "      <td>2.302507e+05</td>\n",
       "      <td>2.131399</td>\n",
       "      <td>3.696228e+03</td>\n",
       "      <td>3.950106e+05</td>\n",
       "      <td>3.891369</td>\n",
       "      <td>19.197474</td>\n",
       "      <td>5131.150839</td>\n",
       "      <td>2.949793</td>\n",
       "      <td>0.029350</td>\n",
       "      <td>0.014629</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>2.177511e+06</td>\n",
       "      <td>3.542068e+05</td>\n",
       "      <td>2.014193</td>\n",
       "      <td>3.981021e+04</td>\n",
       "      <td>3.082481e+05</td>\n",
       "      <td>1.165359</td>\n",
       "      <td>5.834213</td>\n",
       "      <td>4725.837644</td>\n",
       "      <td>1.697736</td>\n",
       "      <td>0.168785</td>\n",
       "      <td>0.120063</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000e+00</td>\n",
       "      <td>0.000000e+00</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000e+00</td>\n",
       "      <td>5.000000e+04</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>11.990000</td>\n",
       "      <td>200.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.650000e+04</td>\n",
       "      <td>0.000000e+00</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000e+00</td>\n",
       "      <td>2.000000e+05</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>15.250000</td>\n",
       "      <td>2000.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>2.500000e+04</td>\n",
       "      <td>1.000000e+05</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>0.000000e+00</td>\n",
       "      <td>3.000000e+05</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>18.000000</td>\n",
       "      <td>4000.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>4.000000e+04</td>\n",
       "      <td>3.000000e+05</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>3.500000e+03</td>\n",
       "      <td>5.000000e+05</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>20.000000</td>\n",
       "      <td>6250.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>4.445544e+08</td>\n",
       "      <td>1.000000e+07</td>\n",
       "      <td>10.000000</td>\n",
       "      <td>1.000000e+07</td>\n",
       "      <td>3.000000e+06</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>37.000000</td>\n",
       "      <td>50000.000000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Monthly_Income  Loan_Amount_Applied  Loan_Tenure_Applied  Existing_EMI  \\\n",
       "count    8.702000e+04         8.694900e+04         86949.000000  8.694900e+04   \n",
       "mean     5.884997e+04         2.302507e+05             2.131399  3.696228e+03   \n",
       "std      2.177511e+06         3.542068e+05             2.014193  3.981021e+04   \n",
       "min      0.000000e+00         0.000000e+00             0.000000  0.000000e+00   \n",
       "25%      1.650000e+04         0.000000e+00             0.000000  0.000000e+00   \n",
       "50%      2.500000e+04         1.000000e+05             2.000000  0.000000e+00   \n",
       "75%      4.000000e+04         3.000000e+05             4.000000  3.500000e+03   \n",
       "max      4.445544e+08         1.000000e+07            10.000000  1.000000e+07   \n",
       "\n",
       "       Loan_Amount_Submitted  Loan_Tenure_Submitted  Interest_Rate  \\\n",
       "count           5.240700e+04           52407.000000   27726.000000   \n",
       "mean            3.950106e+05               3.891369      19.197474   \n",
       "std             3.082481e+05               1.165359       5.834213   \n",
       "min             5.000000e+04               1.000000      11.990000   \n",
       "25%             2.000000e+05               3.000000      15.250000   \n",
       "50%             3.000000e+05               4.000000      18.000000   \n",
       "75%             5.000000e+05               5.000000      20.000000   \n",
       "max             3.000000e+06               6.000000      37.000000   \n",
       "\n",
       "       Processing_Fee          Var4      LoggedIn     Disbursed  \n",
       "count    27420.000000  87020.000000  87020.000000  87019.000000  \n",
       "mean      5131.150839      2.949793      0.029350      0.014629  \n",
       "std       4725.837644      1.697736      0.168785      0.120063  \n",
       "min        200.000000      0.000000      0.000000      0.000000  \n",
       "25%       2000.000000      1.000000      0.000000      0.000000  \n",
       "50%       4000.000000      3.000000      0.000000      0.000000  \n",
       "75%       6250.000000      5.000000      0.000000      0.000000  \n",
       "max      50000.000000      7.000000      1.000000      1.000000  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "train.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 合并数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:08:27.277754Z",
     "start_time": "2020-06-30T15:08:27.147110Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:4: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n",
      "of pandas will change to not sort by default.\n",
      "\n",
      "To accept the future behavior, pass 'sort=False'.\n",
      "\n",
      "To retain the current behavior and silence the warning, pass 'sort=True'.\n",
      "\n",
      "  after removing the cwd from sys.path.\n"
     ]
    }
   ],
   "source": [
    "#合并训练数据和测试数据\n",
    "train['source'] = 'train'\n",
    "test['source'] = 'test'\n",
    "data = pd.concat([train, test], ignore_index = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:08:27.282740Z",
     "start_time": "2020-06-30T15:08:27.278751Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(124737, 27)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T03:02:56.978653Z",
     "start_time": "2020-07-01T03:02:56.941740Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>City</th>\n",
       "      <th>Device_Type</th>\n",
       "      <th>Disbursed</th>\n",
       "      <th>EMI_Loan_Submitted</th>\n",
       "      <th>Employer_Name</th>\n",
       "      <th>Existing_EMI</th>\n",
       "      <th>Filled_Form</th>\n",
       "      <th>Gender</th>\n",
       "      <th>ID</th>\n",
       "      <th>Interest_Rate</th>\n",
       "      <th>...</th>\n",
       "      <th>Monthly_Income</th>\n",
       "      <th>Processing_Fee</th>\n",
       "      <th>Salary_Account</th>\n",
       "      <th>Source</th>\n",
       "      <th>Var1</th>\n",
       "      <th>Var2</th>\n",
       "      <th>Var4</th>\n",
       "      <th>Var5</th>\n",
       "      <th>source</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>15</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>192</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>ID000002C20</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>20000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>15</td>\n",
       "      <td>1</td>\n",
       "      <td>13</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>train</td>\n",
       "      <td>37</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>44</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6762.9</td>\n",
       "      <td>227</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>ID000004E40</td>\n",
       "      <td>13.25</td>\n",
       "      <td>...</td>\n",
       "      <td>35000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>17</td>\n",
       "      <td>1</td>\n",
       "      <td>8</td>\n",
       "      <td>6</td>\n",
       "      <td>3</td>\n",
       "      <td>13</td>\n",
       "      <td>train</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>52</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>192</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>ID000007H20</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>22500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>37</td>\n",
       "      <td>9</td>\n",
       "      <td>13</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>train</td>\n",
       "      <td>34</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>52</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>192</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>ID000008I30</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>35000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>37</td>\n",
       "      <td>9</td>\n",
       "      <td>13</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>10</td>\n",
       "      <td>train</td>\n",
       "      <td>28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>6</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>192</td>\n",
       "      <td>25000.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>ID000009J40</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>100000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>15</td>\n",
       "      <td>6</td>\n",
       "      <td>13</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>17</td>\n",
       "      <td>train</td>\n",
       "      <td>31</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 26 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   City  Device_Type  Disbursed EMI_Loan_Submitted  Employer_Name  \\\n",
       "0    15            2        0.0                NaN            192   \n",
       "1    44            2        0.0             6762.9            227   \n",
       "2    52            2        0.0                NaN            192   \n",
       "3    52            2        0.0                NaN            192   \n",
       "4     6            2        0.0                NaN            192   \n",
       "\n",
       "   Existing_EMI  Filled_Form  Gender           ID  Interest_Rate ...   \\\n",
       "0           0.0            1       0  ID000002C20            NaN ...    \n",
       "1           0.0            1       1  ID000004E40          13.25 ...    \n",
       "2           0.0            1       1  ID000007H20            NaN ...    \n",
       "3           0.0            1       1  ID000008I30            NaN ...    \n",
       "4       25000.0            1       1  ID000009J40            NaN ...    \n",
       "\n",
       "  Monthly_Income  Processing_Fee  Salary_Account  Source  Var1  Var2  Var4  \\\n",
       "0          20000             NaN              15       1    13     6     1   \n",
       "1          35000             NaN              17       1     8     6     3   \n",
       "2          22500             NaN              37       9    13     1     1   \n",
       "3          35000             NaN              37       9    13     1     3   \n",
       "4         100000             NaN              15       6    13     1     3   \n",
       "\n",
       "   Var5  source  Age  \n",
       "0     0   train   37  \n",
       "1    13   train   30  \n",
       "2     0   train   34  \n",
       "3    10   train   28  \n",
       "4    17   train   31  \n",
       "\n",
       "[5 rows x 26 columns]"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 查看数据的质量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:08:27.655744Z",
     "start_time": "2020-06-30T15:08:27.283738Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "City                      1401\n",
       "DOB                          0\n",
       "Device_Type                  0\n",
       "Disbursed                37718\n",
       "EMI_Loan_Submitted       84900\n",
       "Employer_Name              113\n",
       "Existing_EMI               111\n",
       "Filled_Form                  0\n",
       "Gender                       0\n",
       "ID                           0\n",
       "Interest_Rate            84901\n",
       "Lead_Creation_Date           0\n",
       "Loan_Amount_Applied        111\n",
       "Loan_Amount_Submitted    49535\n",
       "Loan_Tenure_Applied        111\n",
       "Loan_Tenure_Submitted    49535\n",
       "LoggedIn                 37717\n",
       "Mobile_Verified              0\n",
       "Monthly_Income               0\n",
       "Processing_Fee           85346\n",
       "Salary_Account           16801\n",
       "Source                       0\n",
       "Var1                         1\n",
       "Var2                         0\n",
       "Var4                         0\n",
       "Var5                         0\n",
       "source                       0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#检查数据的质量：异常点、缺省值\n",
    "data.apply(lambda x: sum(x.isnull()))\n",
    "#lightGBM和XGBoost会处理缺失值"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 查看类别行特征的分布和取值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:08:28.050687Z",
     "start_time": "2020-06-30T15:08:27.657741Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Gender属性有2的不同取值，各取值以及其出现的次数\n",
      "\n",
      "Male      71398\n",
      "Female    53339\n",
      "Name: Gender, dtype: int64\n",
      "\n",
      "City属性有724的不同取值，各取值以及其出现的次数\n",
      "\n",
      "Delhi                  17936\n",
      "Bengaluru              15522\n",
      "Mumbai                 15425\n",
      "Hyderabad              10410\n",
      "Chennai                 9895\n",
      "Pune                    7427\n",
      "Kolkata                 4282\n",
      "Ahmedabad               2528\n",
      "Jaipur                  1892\n",
      "Gurgaon                 1743\n",
      "Coimbatore              1659\n",
      "Thane                   1306\n",
      "Chandigarh              1266\n",
      "Surat                   1149\n",
      "Visakhapatnam           1080\n",
      "Indore                  1051\n",
      "Vadodara                 893\n",
      "Nagpur                   879\n",
      "Lucknow                  813\n",
      "Ghaziabad                795\n",
      "Bhopal                   735\n",
      "Kochi                    692\n",
      "Patna                    675\n",
      "Faridabad                651\n",
      "Noida                    549\n",
      "Madurai                  534\n",
      "Gautam Buddha Nagar      485\n",
      "Dehradun                 444\n",
      "Raipur                   430\n",
      "Bhubaneswar              407\n",
      "                       ...  \n",
      "SAYAN                      1\n",
      "Seoni                      1\n",
      "Champawat                  1\n",
      "GANDEVI                    1\n",
      "Kargil                     1\n",
      "KAMREJ                     1\n",
      "Pulwama                    1\n",
      "Bandipore                  1\n",
      "Madhepura                  1\n",
      "Sheikhpura                 1\n",
      "Lohit                      1\n",
      "UDWADA                     1\n",
      "Mainpuri                   1\n",
      "Dhalai                     1\n",
      "Khagaria                   1\n",
      "Chinnamiram                1\n",
      "Siruguppa                  1\n",
      "Champhai                   1\n",
      "Kannauj                    1\n",
      "CHOTILA                    1\n",
      "SOMNATH JUNAGADHA          1\n",
      "Balrampur                  1\n",
      "Bageshwar                  1\n",
      "Panna                      1\n",
      "Umaria                     1\n",
      "Raisen                     1\n",
      "RADHANPUR                  1\n",
      "Narayanpur                 1\n",
      "DHANDHUKA                  1\n",
      "Karim Ganj                 1\n",
      "Name: City, Length: 723, dtype: int64\n",
      "\n",
      "Employer_Name属性有57194的不同取值，各取值以及其出现的次数\n",
      "\n",
      "0                                                      6900\n",
      "TATA CONSULTANCY SERVICES LTD (TCS)                     754\n",
      "COGNIZANT TECHNOLOGY SOLUTIONS INDIA PVT LTD            558\n",
      "ACCENTURE SERVICES PVT LTD                              476\n",
      "GOOGLE                                                  408\n",
      "HCL TECHNOLOGIES LTD                                    337\n",
      "ICICI BANK LTD                                          337\n",
      "IBM CORPORATION                                         265\n",
      "INDIAN AIR FORCE                                        258\n",
      "INFOSYS TECHNOLOGIES                                    257\n",
      "INDIAN ARMY                                             243\n",
      "GENPACT                                                 240\n",
      "WIPRO TECHNOLOGIES                                      235\n",
      "TYPE SLOWLY FOR AUTO FILL                               219\n",
      "IKYA HUMAN CAPITAL SOLUTIONS LTD                        204\n",
      "ARMY                                                    203\n",
      "INDIAN RAILWAY                                          201\n",
      "HDFC BANK LTD                                           201\n",
      "STATE GOVERNMENT                                        199\n",
      "WIPRO BPO                                               186\n",
      "INDIAN NAVY                                             183\n",
      "CONVERGYS INDIA SERVICES PVT LTD                        165\n",
      "OTHERS                                                  159\n",
      "TECH MAHINDRA LTD                                       158\n",
      "IBM GLOBAL SERVICES INDIA LTD                           158\n",
      "CONCENTRIX DAKSH SERVICES INDIA PVT LTD                 154\n",
      "CAPGEMINI INDIA PVT LTD                                 152\n",
      "SERCO BPO PVT LTD                                       149\n",
      "SUTHERLAND GLOBAL SERVICES PVT LTD                      141\n",
      "ADECCO INDIA PVT LTD                                    140\n",
      "                                                       ... \n",
      "PRINCE RAJ                                                1\n",
      "JAYVADAN B JARIWALA                                       1\n",
      "JITENDRASINGH RATHORE                                     1\n",
      "POWER TECHNOLOGY COMPUTERS PVT LMD                        1\n",
      "BIOAX MEDISCIENCE                                         1\n",
      "AVALARA TECHNOLOGIES PVT LTD                              1\n",
      "JAYAT                                                     1\n",
      "ASWANI LINESH                                             1\n",
      "XCELVATIONS PVT LTD                                       1\n",
      "AUTOEDIT                                                  1\n",
      "SOFT AGE INFORMATION TECHNOLOGY LTD                       1\n",
      "INTUIT INDIA TECHNOLOGY TECHNOLOGY SERVICES PVT LTD       1\n",
      "CHETAK TRAVELLING AGENCY                                  1\n",
      "PRAVIN ABUJ                                               1\n",
      "E Z VIDYA PVT LTD                                         1\n",
      "SHRESHT INDUSTRIES PRAVATE LIMITED                        1\n",
      "SYNERGIC TRAILER & AUTO SOLUTIONS PVT LTD                 1\n",
      "TCFSL                                                     1\n",
      "BOMBAY ELECTRIC SUPPLY AND TRANSPORT                      1\n",
      "K.SIVARAMPRASAD                                           1\n",
      "AJIES                                                     1\n",
      "N.VAISHNAVI                                               1\n",
      "BANGARU MAHESH                                            1\n",
      "BJ SAREE & CO                                             1\n",
      "RBA FERRO INDUSTRIES PVT LTD                              1\n",
      "TATA AIA LIFE INSURANCE                                   1\n",
      "SP                                                        1\n",
      "FORCE I SECURITY SERVICES PVT LTD                         1\n",
      "DIRECTORATE OF TECHNICAL EDUCATION                        1\n",
      "MAS EQUIPMENTS PVT. LTD.                                  1\n",
      "Name: Employer_Name, Length: 57193, dtype: int64\n",
      "\n",
      "Salary_Account属性有60的不同取值，各取值以及其出现的次数\n",
      "\n",
      "HDFC Bank                                          25180\n",
      "ICICI Bank                                         19547\n",
      "State Bank of India                                17110\n",
      "Axis Bank                                          12590\n",
      "Citibank                                            3398\n",
      "Kotak Bank                                          2955\n",
      "IDBI Bank                                           2213\n",
      "Punjab National Bank                                1747\n",
      "Bank of India                                       1713\n",
      "Bank of Baroda                                      1675\n",
      "Standard Chartered Bank                             1434\n",
      "Canara Bank                                         1384\n",
      "Union Bank of India                                 1330\n",
      "Yes Bank                                            1120\n",
      "ING Vysya                                            996\n",
      "Corporation bank                                     948\n",
      "Indian Overseas Bank                                 901\n",
      "State Bank of Hyderabad                              854\n",
      "Indian Bank                                          773\n",
      "Oriental Bank of Commerce                            761\n",
      "IndusInd Bank                                        711\n",
      "Andhra Bank                                          706\n",
      "Central Bank of India                                648\n",
      "Syndicate Bank                                       614\n",
      "Bank of Maharasthra                                  576\n",
      "HSBC                                                 474\n",
      "State Bank of Bikaner & Jaipur                       448\n",
      "Karur Vysya Bank                                     435\n",
      "State Bank of Mysore                                 385\n",
      "Federal Bank                                         377\n",
      "Vijaya Bank                                          354\n",
      "Allahabad Bank                                       345\n",
      "UCO Bank                                             344\n",
      "State Bank of Travancore                             333\n",
      "Karnataka Bank                                       279\n",
      "United Bank of India                                 276\n",
      "Dena Bank                                            268\n",
      "Saraswat Bank                                        265\n",
      "State Bank of Patiala                                263\n",
      "South Indian Bank                                    223\n",
      "Deutsche Bank                                        176\n",
      "Abhyuday Co-op Bank Ltd                              161\n",
      "The Ratnakar Bank Ltd                                113\n",
      "Tamil Nadu Mercantile Bank                           103\n",
      "Punjab & Sind bank                                    84\n",
      "J&K Bank                                              78\n",
      "Lakshmi Vilas bank                                    69\n",
      "Dhanalakshmi Bank Ltd                                 66\n",
      "State Bank of Indore                                  32\n",
      "Catholic Syrian Bank                                  27\n",
      "India Bulls                                           21\n",
      "B N P Paribas                                         15\n",
      "Firstrand Bank Limited                                11\n",
      "GIC Housing Finance Ltd                               10\n",
      "Bank of Rajasthan                                      8\n",
      "Kerala Gramin Bank                                     4\n",
      "Industrial And Commercial Bank Of China Limited        3\n",
      "N                                                      1\n",
      "Ahmedabad Mercantile Cooperative Bank                  1\n",
      "Name: Salary_Account, dtype: int64\n"
     ]
    },
    {
     "ename": "KeyError",
     "evalue": "'Mobile_verified'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\pandas\\core\\indexes\\base.py\u001b[0m in \u001b[0;36mget_loc\u001b[1;34m(self, key, method, tolerance)\u001b[0m\n\u001b[0;32m   3077\u001b[0m             \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3078\u001b[1;33m                 \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   3079\u001b[0m             \u001b[1;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;31mKeyError\u001b[0m: 'Mobile_verified'",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[1;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-11-85457d68c6c7>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m     12\u001b[0m                 'Var4']\n\u001b[0;32m     13\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mcol\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mcat_features\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 14\u001b[1;33m     \u001b[0mnum_vlaules\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mcol\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0munique\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     15\u001b[0m     \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'\\n%s属性有%d的不同取值，各取值以及其出现的次数\\n'\u001b[0m\u001b[1;33m%\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mcol\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnum_vlaules\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     16\u001b[0m     \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mcol\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalue_counts\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\pandas\\core\\frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m   2686\u001b[0m             \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2687\u001b[0m         \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2688\u001b[1;33m             \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem_column\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   2689\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2690\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0m_getitem_column\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\pandas\\core\\frame.py\u001b[0m in \u001b[0;36m_getitem_column\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m   2693\u001b[0m         \u001b[1;31m# get column\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2694\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mis_unique\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2695\u001b[1;33m             \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_get_item_cache\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   2696\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2697\u001b[0m         \u001b[1;31m# duplicate columns & possible reduce dimensionality\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36m_get_item_cache\u001b[1;34m(self, item)\u001b[0m\n\u001b[0;32m   2487\u001b[0m         \u001b[0mres\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcache\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2488\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mres\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2489\u001b[1;33m             \u001b[0mvalues\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   2490\u001b[0m             \u001b[0mres\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_box_item_values\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalues\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2491\u001b[0m             \u001b[0mcache\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mres\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\pandas\\core\\internals.py\u001b[0m in \u001b[0;36mget\u001b[1;34m(self, item, fastpath)\u001b[0m\n\u001b[0;32m   4113\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   4114\u001b[0m             \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0misna\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 4115\u001b[1;33m                 \u001b[0mloc\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   4116\u001b[0m             \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   4117\u001b[0m                 \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0misna\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\pandas\\core\\indexes\\base.py\u001b[0m in \u001b[0;36mget_loc\u001b[1;34m(self, key, method, tolerance)\u001b[0m\n\u001b[0;32m   3078\u001b[0m                 \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   3079\u001b[0m             \u001b[1;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3080\u001b[1;33m                 \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_maybe_cast_indexer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   3081\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   3082\u001b[0m         \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_indexer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtolerance\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mtolerance\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;31mKeyError\u001b[0m: 'Mobile_verified'"
     ]
    }
   ],
   "source": [
    "\n",
    "cat_features = ['Gender', \n",
    "                'City', \n",
    "                'Employer_Name', \n",
    "                'Salary_Account', \n",
    "                'Mobile_verified',\n",
    "                'Var1',\n",
    "                'Filled_Form',\n",
    "                'Device_Type',\n",
    "                'Var2',\n",
    "                'Source',\n",
    "                'Var4']\n",
    "for col in cat_features:\n",
    "    num_vlaules = len(data[col].unique())\n",
    "    print('\\n%s属性有%d的不同取值，各取值以及其出现的次数\\n'% (col, num_vlaules))\n",
    "    print(data[col].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:09:13.760400Z",
     "start_time": "2020-06-30T15:09:13.756417Z"
    }
   },
   "outputs": [],
   "source": [
    "#将类别型分为两大类，一类像City, Employer_Name, Salary_Account, Source一样特征取值很多\n",
    "#将这类特征去前几个重要的，后别特征取值少的合并成一个Others\n",
    "\n",
    "#在LightGBM中也会对他进行处理，在对类别型特征建立直方图时，其中max_bin参数就是控制特征总量的，默认值是255\n",
    "#一旦特征数超过255，就像特征City的数目有700多个，他会保留取值较大的特征，去掉样本数目较少的。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T09:07:33.559445Z",
     "start_time": "2020-07-01T09:07:33.556461Z"
    }
   },
   "source": [
    "## 特征过程"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 过滤取值较小的特征样本"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:09:16.873592Z",
     "start_time": "2020-06-30T15:09:16.662084Z"
    }
   },
   "outputs": [],
   "source": [
    "\n",
    "cat_features = ['City', 'Employer_Name', 'Salary_Account', 'Source']\n",
    "rare_thresholds = [100, 30, 40, 40]\n",
    "j = 0\n",
    "for col in cat_features:\n",
    "    #提取每个特征的样本数\n",
    "    value_counts_col = data[col].value_counts(dropna = False)\n",
    "    rare_threshold = rare_thresholds[j]\n",
    "    value_counts_rare = list(value_counts_col[value_counts_col < rare_threshold].index)\n",
    "    \n",
    "    rare_index = data[col].isin(value_counts_rare)\n",
    "    #将小于阈值的样本设为“Others”\n",
    "    data.loc[data[col].isin(value_counts_rare), col] = \"Others\"\n",
    "    \n",
    "    j = j + 1\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 处理日期型特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:09:36.372627Z",
     "start_time": "2020-06-30T15:09:20.057547Z"
    }
   },
   "outputs": [],
   "source": [
    "#日期型特征的处理\n",
    "#DOB(客户申请贷款的年龄)\n",
    "data['Age'] = pd.to_datetime(data['Lead_Creation_Date']).dt.year - pd.to_datetime(data['DOB']).dt.year"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:09:44.015894Z",
     "start_time": "2020-06-30T15:09:43.976995Z"
    }
   },
   "outputs": [],
   "source": [
    "#去掉原始的DOB字段\n",
    "data.drop(['DOB'], axis = 1, inplace = True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 将不合理的贷款年限，设置为缺失值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:09:45.107160Z",
     "start_time": "2020-06-30T15:09:45.094229Z"
    }
   },
   "outputs": [],
   "source": [
    "\n",
    "data['Loan_Tenure_Applied'].replace([10, 6, 7, 8, 9], value = np.nan, inplace = True)\n",
    "data['Loan_Tenure_Submitted'].replace(6, np.nan, inplace = True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 将没用的特征去除"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:09:46.547978Z",
     "start_time": "2020-06-30T15:09:46.516054Z"
    }
   },
   "outputs": [],
   "source": [
    "\n",
    "data.drop('LoggedIn', axis = 1, inplace = True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 类别型的特征先编码成数值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:09:51.924616Z",
     "start_time": "2020-06-30T15:09:49.631761Z"
    }
   },
   "outputs": [],
   "source": [
    "#类别型的特征先编码成数值，LightGBM无需One-hot编码\n",
    "\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "le = LabelEncoder()\n",
    "feats_to_encode = ['City',                        \n",
    "                   'Employer_Name', \n",
    "                   'Salary_Account', \n",
    "                   'Device_Type', \n",
    "                   'Filled_Form', \n",
    "                   'Gender', \n",
    "                   'Mobile_Verified',\n",
    "                   'Var1',\n",
    "                   'Var2',\n",
    "                   'Source',\n",
    "                  ]\n",
    "for col in feats_to_encode:\n",
    "    data[col] = le.fit_transform(data[col].astype(str))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:10:02.402051Z",
     "start_time": "2020-06-30T15:10:02.369103Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>City</th>\n",
       "      <th>Device_Type</th>\n",
       "      <th>Disbursed</th>\n",
       "      <th>EMI_Loan_Submitted</th>\n",
       "      <th>Employer_Name</th>\n",
       "      <th>Existing_EMI</th>\n",
       "      <th>Filled_Form</th>\n",
       "      <th>Gender</th>\n",
       "      <th>ID</th>\n",
       "      <th>Interest_Rate</th>\n",
       "      <th>...</th>\n",
       "      <th>Monthly_Income</th>\n",
       "      <th>Processing_Fee</th>\n",
       "      <th>Salary_Account</th>\n",
       "      <th>Source</th>\n",
       "      <th>Var1</th>\n",
       "      <th>Var2</th>\n",
       "      <th>Var4</th>\n",
       "      <th>Var5</th>\n",
       "      <th>source</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>15</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>192</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>ID000002C20</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>20000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>15</td>\n",
       "      <td>1</td>\n",
       "      <td>13</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>train</td>\n",
       "      <td>37</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>44</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6762.9</td>\n",
       "      <td>227</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>ID000004E40</td>\n",
       "      <td>13.25</td>\n",
       "      <td>...</td>\n",
       "      <td>35000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>17</td>\n",
       "      <td>1</td>\n",
       "      <td>8</td>\n",
       "      <td>6</td>\n",
       "      <td>3</td>\n",
       "      <td>13</td>\n",
       "      <td>train</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>52</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>192</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>ID000007H20</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>22500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>37</td>\n",
       "      <td>9</td>\n",
       "      <td>13</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>train</td>\n",
       "      <td>34</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>52</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>192</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>ID000008I30</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>35000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>37</td>\n",
       "      <td>9</td>\n",
       "      <td>13</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>10</td>\n",
       "      <td>train</td>\n",
       "      <td>28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>6</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>192</td>\n",
       "      <td>25000.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>ID000009J40</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>100000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>15</td>\n",
       "      <td>6</td>\n",
       "      <td>13</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>17</td>\n",
       "      <td>train</td>\n",
       "      <td>31</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 26 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   City  Device_Type  Disbursed EMI_Loan_Submitted  Employer_Name  \\\n",
       "0    15            2        0.0                NaN            192   \n",
       "1    44            2        0.0             6762.9            227   \n",
       "2    52            2        0.0                NaN            192   \n",
       "3    52            2        0.0                NaN            192   \n",
       "4     6            2        0.0                NaN            192   \n",
       "\n",
       "   Existing_EMI  Filled_Form  Gender           ID  Interest_Rate ...   \\\n",
       "0           0.0            1       0  ID000002C20            NaN ...    \n",
       "1           0.0            1       1  ID000004E40          13.25 ...    \n",
       "2           0.0            1       1  ID000007H20            NaN ...    \n",
       "3           0.0            1       1  ID000008I30            NaN ...    \n",
       "4       25000.0            1       1  ID000009J40            NaN ...    \n",
       "\n",
       "  Monthly_Income  Processing_Fee  Salary_Account  Source  Var1  Var2  Var4  \\\n",
       "0          20000             NaN              15       1    13     6     1   \n",
       "1          35000             NaN              17       1     8     6     3   \n",
       "2          22500             NaN              37       9    13     1     1   \n",
       "3          35000             NaN              37       9    13     1     3   \n",
       "4         100000             NaN              15       6    13     1     3   \n",
       "\n",
       "   Var5  source  Age  \n",
       "0     0   train   37  \n",
       "1    13   train   30  \n",
       "2     0   train   34  \n",
       "3    10   train   28  \n",
       "4    17   train   31  \n",
       "\n",
       "[5 rows x 26 columns]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 分离训练数据和测试数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:10:07.850919Z",
     "start_time": "2020-06-30T15:10:07.692303Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\pandas\\core\\frame.py:3697: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  errors=errors)\n"
     ]
    }
   ],
   "source": [
    "\n",
    "train = data.loc[data['source'] == 'train']\n",
    "test = data.loc[data['source'] == 'test']\n",
    "train.drop('source', axis = 1, inplace = True)\n",
    "test.drop(['source', 'Disbursed'], axis = 1, inplace = True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 保存数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:10:14.056003Z",
     "start_time": "2020-06-30T15:10:12.601894Z"
    }
   },
   "outputs": [],
   "source": [
    "train.to_csv('FE_train.csv', index = False)\n",
    "test.to_csv('FE_test.csv', index = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 用LightGBM完成任务，并用交叉验证对模型的超参数（learning_rate、n_estimators、num_leaves、max_depth、min_data_in_leaf、colsample_bytree、subsample）进行调优。（70分）\n",
    "或者用XGBoost完成任务，并用交叉验证对模型的超参数（learning_rate、n_estimators、max_depth、min_child_weight、colsample_bytree、subsample、reg_lambda、reg_）进行调优。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:10:43.006083Z",
     "start_time": "2020-06-30T15:10:42.863389Z"
    }
   },
   "outputs": [],
   "source": [
    "import lightgbm as lgbm\n",
    "from lightgbm.sklearn import LGBMClassifier\n",
    "from sklearn.model_selection import GridSearchCV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T05:59:18.239528Z",
     "start_time": "2020-07-01T05:59:17.600238Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\IPython\\core\\interactiveshell.py:2785: DtypeWarning: Columns (3,23) have mixed types. Specify dtype option on import or set low_memory=False.\n",
      "  interactivity=interactivity, compiler=compiler, result=result)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>City</th>\n",
       "      <th>Device_Type</th>\n",
       "      <th>Disbursed</th>\n",
       "      <th>EMI_Loan_Submitted</th>\n",
       "      <th>Employer_Name</th>\n",
       "      <th>Existing_EMI</th>\n",
       "      <th>Filled_Form</th>\n",
       "      <th>Gender</th>\n",
       "      <th>ID</th>\n",
       "      <th>Interest_Rate</th>\n",
       "      <th>...</th>\n",
       "      <th>Mobile_Verified</th>\n",
       "      <th>Monthly_Income</th>\n",
       "      <th>Processing_Fee</th>\n",
       "      <th>Salary_Account</th>\n",
       "      <th>Source</th>\n",
       "      <th>Var1</th>\n",
       "      <th>Var2</th>\n",
       "      <th>Var4</th>\n",
       "      <th>Var5</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>15</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>192</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>ID000002C20</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>20000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>15</td>\n",
       "      <td>1</td>\n",
       "      <td>13</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>37</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>44</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6762.9</td>\n",
       "      <td>227</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>ID000004E40</td>\n",
       "      <td>13.25</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>35000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>17</td>\n",
       "      <td>1</td>\n",
       "      <td>8</td>\n",
       "      <td>6</td>\n",
       "      <td>3</td>\n",
       "      <td>13</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>52</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>192</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>ID000007H20</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>22500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>37</td>\n",
       "      <td>9</td>\n",
       "      <td>13</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>34</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>52</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>192</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>ID000008I30</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>35000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>37</td>\n",
       "      <td>9</td>\n",
       "      <td>13</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>10</td>\n",
       "      <td>28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>6</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>192</td>\n",
       "      <td>25000.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>ID000009J40</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>100000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>15</td>\n",
       "      <td>6</td>\n",
       "      <td>13</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>17</td>\n",
       "      <td>31</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 25 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   City  Device_Type  Disbursed EMI_Loan_Submitted  Employer_Name  \\\n",
       "0    15            2        0.0                NaN            192   \n",
       "1    44            2        0.0             6762.9            227   \n",
       "2    52            2        0.0                NaN            192   \n",
       "3    52            2        0.0                NaN            192   \n",
       "4     6            2        0.0                NaN            192   \n",
       "\n",
       "   Existing_EMI  Filled_Form  Gender           ID  Interest_Rate ...   \\\n",
       "0           0.0            1       0  ID000002C20            NaN ...    \n",
       "1           0.0            1       1  ID000004E40          13.25 ...    \n",
       "2           0.0            1       1  ID000007H20            NaN ...    \n",
       "3           0.0            1       1  ID000008I30            NaN ...    \n",
       "4       25000.0            1       1  ID000009J40            NaN ...    \n",
       "\n",
       "  Mobile_Verified  Monthly_Income  Processing_Fee  Salary_Account  Source  \\\n",
       "0               1           20000             NaN              15       1   \n",
       "1               2           35000             NaN              17       1   \n",
       "2               2           22500             NaN              37       9   \n",
       "3               2           35000             NaN              37       9   \n",
       "4               2          100000             NaN              15       6   \n",
       "\n",
       "   Var1  Var2  Var4  Var5  Age  \n",
       "0    13     6     1     0   37  \n",
       "1     8     6     3    13   30  \n",
       "2    13     1     1     0   34  \n",
       "3    13     1     3    10   28  \n",
       "4    13     1     3    17   31  \n",
       "\n",
       "[5 rows x 25 columns]"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train = pd.read_csv(\"FE_train.csv\")\n",
    "\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T07:19:42.240148Z",
     "start_time": "2020-07-01T07:19:42.191232Z"
    }
   },
   "outputs": [],
   "source": [
    "#将数据中的NaN值进行填充\n",
    "train = train.fillna(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T07:20:07.919543Z",
     "start_time": "2020-07-01T07:20:07.899588Z"
    }
   },
   "outputs": [],
   "source": [
    "\n",
    "y_train = train['Disbursed']\n",
    "x_train = train.drop([\"ID\", \"Disbursed\"], axis = 1)\n",
    "\n",
    "feat_names = x_train.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T07:20:15.788714Z",
     "start_time": "2020-07-01T07:20:15.785722Z"
    }
   },
   "outputs": [],
   "source": [
    "MAX_ROUNDS = 10000#最大迭代次数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T07:20:18.912190Z",
     "start_time": "2020-07-01T07:20:18.907208Z"
    }
   },
   "outputs": [],
   "source": [
    "#交叉验证分组\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "kfold = StratifiedKFold(n_splits = 5, shuffle = True, random_state = 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T07:20:23.972552Z",
     "start_time": "2020-07-01T07:20:23.967565Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['City', 'Device_Type', 'EMI_Loan_Submitted', 'Employer_Name',\n",
       "       'Existing_EMI', 'Filled_Form', 'Gender', 'Interest_Rate',\n",
       "       'Lead_Creation_Date', 'Loan_Amount_Applied', 'Loan_Amount_Submitted',\n",
       "       'Loan_Tenure_Applied', 'Loan_Tenure_Submitted', 'Mobile_Verified',\n",
       "       'Monthly_Income', 'Processing_Fee', 'Salary_Account', 'Source', 'Var1',\n",
       "       'Var2', 'Var4', 'Var5', 'Age'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T07:20:27.862446Z",
     "start_time": "2020-07-01T07:20:27.852516Z"
    }
   },
   "outputs": [],
   "source": [
    "def get_n_estimators(params, x_train, y_train, early_stopping_rounds = 10):\n",
    "    #设置参数\n",
    "    lgbm_params = params.copy()   \n",
    "    #构造训练数据\n",
    "    lgbmtrain = lgbm.Dataset(x_train, y_train)\n",
    "    \n",
    "    #将参数和数据传到 LightGBM的cv函数中\n",
    "    cv_result = lgbm.cv(lgbm_params, #参数,见下面设置\n",
    "                        lgbmtrain, #训练数据\n",
    "                        num_boost_round = MAX_ROUNDS, #弱分类器的数目\n",
    "                        nfold = 5, #交叉验证的折数\n",
    "                        metrics = 'auc', #评价指标\n",
    "                        early_stopping_rounds = early_stopping_rounds, #模型的性能为提升的次数超过过早停止设置的数值，则停止训练\n",
    "                        seed = 3)\n",
    "    \n",
    "    print('best n_estimators:', len(cv_result['auc-mean']))\n",
    "    print('best cv score:', cv_result['auc-mean'][-1])\n",
    "    \n",
    "    return len(cv_result['auc-mean'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:08:28.067642Z",
     "start_time": "2020-06-30T15:08:22.528Z"
    }
   },
   "source": [
    "## n_estimators"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:11:12.376591Z",
     "start_time": "2020-06-30T15:11:12.285871Z"
    }
   },
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "DataFrame.dtypes for data must be int, float or bool.\nDid not expect the data types in the following fields: EMI_Loan_Submitted, Lead_Creation_Date, Var5",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-28-b4f1f20ef52b>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m      9\u001b[0m          \u001b[1;34m'verbosity'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[1;36m5\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     10\u001b[0m          }\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mn_estimators_1\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mget_n_estimators\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mparams\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx_train\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_train\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32m<ipython-input-27-34bedf5f5a9a>\u001b[0m in \u001b[0;36mget_n_estimators\u001b[1;34m(params, x_train, y_train, early_stopping_rounds)\u001b[0m\n\u001b[0;32m     12\u001b[0m                         \u001b[0mmetrics\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m'auc'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;31m#评价指标\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     13\u001b[0m                         \u001b[0mearly_stopping_rounds\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mearly_stopping_rounds\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;31m#模型的性能为提升的次数超过过早停止设置的数值，则停止训练\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 14\u001b[1;33m                         seed = 3)\n\u001b[0m\u001b[0;32m     15\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     16\u001b[0m     \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'best n_estimators:'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcv_result\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'auc-mean'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\lightgbm\\engine.py\u001b[0m in \u001b[0;36mcv\u001b[1;34m(params, train_set, num_boost_round, folds, nfold, stratified, shuffle, metrics, fobj, feval, init_model, feature_name, categorical_feature, early_stopping_rounds, fpreproc, verbose_eval, show_stdv, seed, callbacks, eval_train_metric)\u001b[0m\n\u001b[0;32m    533\u001b[0m                             \u001b[0mparams\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mparams\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mseed\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mseed\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfpreproc\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mfpreproc\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    534\u001b[0m                             \u001b[0mstratified\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mstratified\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mshuffle\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mshuffle\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 535\u001b[1;33m                             eval_train_metric=eval_train_metric)\n\u001b[0m\u001b[0;32m    536\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    537\u001b[0m     \u001b[1;31m# setup callbacks\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\lightgbm\\engine.py\u001b[0m in \u001b[0;36m_make_n_folds\u001b[1;34m(full_data, folds, nfold, params, seed, fpreproc, stratified, shuffle, eval_train_metric)\u001b[0m\n\u001b[0;32m    300\u001b[0m                   shuffle=True, eval_train_metric=False):\n\u001b[0;32m    301\u001b[0m     \u001b[1;34m\"\"\"Make a n-fold list of Booster from random indices.\"\"\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 302\u001b[1;33m     \u001b[0mfull_data\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mfull_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconstruct\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    303\u001b[0m     \u001b[0mnum_data\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mfull_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mnum_data\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    304\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0mfolds\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\lightgbm\\basic.py\u001b[0m in \u001b[0;36mconstruct\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m   1083\u001b[0m                                 \u001b[0minit_score\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minit_score\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpredictor\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_predictor\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1084\u001b[0m                                 \u001b[0msilent\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msilent\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfeature_name\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfeature_name\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1085\u001b[1;33m                                 categorical_feature=self.categorical_feature, params=self.params)\n\u001b[0m\u001b[0;32m   1086\u001b[0m             \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfree_raw_data\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1087\u001b[0m                 \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdata\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\lightgbm\\basic.py\u001b[0m in \u001b[0;36m_lazy_init\u001b[1;34m(self, data, label, reference, weight, group, init_score, predictor, silent, feature_name, categorical_feature, params)\u001b[0m\n\u001b[0;32m    828\u001b[0m                                                                                              \u001b[0mfeature_name\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    829\u001b[0m                                                                                              \u001b[0mcategorical_feature\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 830\u001b[1;33m                                                                                              self.pandas_categorical)\n\u001b[0m\u001b[0;32m    831\u001b[0m         \u001b[0mlabel\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_label_from_pandas\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlabel\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    832\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\Anaconda3\\lib\\site-packages\\lightgbm\\basic.py\u001b[0m in \u001b[0;36m_data_from_pandas\u001b[1;34m(data, feature_name, categorical_feature, pandas_categorical)\u001b[0m\n\u001b[0;32m    342\u001b[0m             raise ValueError(\"DataFrame.dtypes for data must be int, float or bool.\\n\"\n\u001b[0;32m    343\u001b[0m                              \u001b[1;34m\"Did not expect the data types in the following fields: \"\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 344\u001b[1;33m                              + ', '.join(data.columns[bad_indices]))\n\u001b[0m\u001b[0;32m    345\u001b[0m         \u001b[0mdata\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    346\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdtype\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfloat32\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdtype\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfloat64\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mValueError\u001b[0m: DataFrame.dtypes for data must be int, float or bool.\nDid not expect the data types in the following fields: EMI_Loan_Submitted, Lead_Creation_Date, Var5"
     ]
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "         'objective': 'binary',#两类分类问题\n",
    "         'is_unbalance': True,\n",
    "         'n_jobs': -1,\n",
    "         'learning_rate': 0.1,\n",
    "         'num_leaves': 60,#叶子节点数目:建议值在60-80之间\n",
    "         'max_depth': 6,\n",
    "         'colsample_bytree': 0.7,\n",
    "         'verbosity': 5\n",
    "         }\n",
    "n_estimators_1 = get_n_estimators(params, x_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-30T15:14:37.582426Z",
     "start_time": "2020-06-30T15:14:37.578436Z"
    }
   },
   "outputs": [],
   "source": [
    "#将提示的包含错误数据类型这一列进行转换"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T07:34:20.516935Z",
     "start_time": "2020-07-01T07:34:18.116235Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\lightgbm\\basic.py:842: UserWarning: categorical_feature keyword has been found in `params` and will be ignored.\n",
      "Please use categorical_feature argument of the Dataset constructor to pass this parameter.\n",
      "  .format(key))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best n_estimators: 43\n",
      "best cv score: 0.807157367931\n"
     ]
    }
   ],
   "source": [
    "from sklearn import preprocessing\n",
    "lbl = preprocessing.LabelEncoder()\n",
    "x_train['EMI_Loan_Submitted'] = lbl.fit_transform(x_train['EMI_Loan_Submitted'].astype(str))#将提示的包含错误数据类型这一列进行转换\n",
    "x_train['Lead_Creation_Date'] = lbl.fit_transform(x_train['Lead_Creation_Date'].astype(str))\n",
    "x_train['Var5'] = lbl.fit_transform(x_train['Var5'].astype(str))\n",
    "params = {'boosting_type': 'goss',\n",
    "         'objective': 'binary',#两类分类问题\n",
    "         'is_unbalance': True,\n",
    "         'n_jobs': -1,\n",
    "         'categorical_feature':[0,1,3,5,6,12,15,16,17,18,19,20],\n",
    "         'learning_rate': 0.1,\n",
    "         'num_leaves': 70,#叶子节点数目:建议值在60-80之间\n",
    "         'max_depth': 7,\n",
    "         'colsample_bytree': 0.7,\n",
    "         'verbosity': 5\n",
    "         }\n",
    "n_estimators_1 = get_n_estimators(params, x_train, y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## num_leaves & max_depth\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:22:48.136272Z",
     "start_time": "2020-07-01T08:22:41.678647Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 4 candidates, totalling 20 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 12 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done   2 out of  20 | elapsed:    3.1s remaining:   28.9s\n",
      "[Parallel(n_jobs=-1)]: Done   7 out of  20 | elapsed:    3.6s remaining:    6.7s\n",
      "[Parallel(n_jobs=-1)]: Done  12 out of  20 | elapsed:    4.5s remaining:    2.9s\n",
      "[Parallel(n_jobs=-1)]: Done  17 out of  20 | elapsed:    6.3s remaining:    1.0s\n",
      "[Parallel(n_jobs=-1)]: Done  20 out of  20 | elapsed:    6.3s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=3, shuffle=True),\n",
       "       error_score='raise-deprecating',\n",
       "       estimator=LGBMClassifier(boosting_type='goss',\n",
       "        categorical_feature=[0, 1, 3, 5, 6, 12, 15, 16, 17, 18, 19, 20],\n",
       "        class_weight=None, colsample_bytree=0.7, importance_type='split',\n",
       "        is_unbalance=True, learning_rate=0.1, max_depth=9,\n",
       "        min_child_samples=20, min_child_weight=....0, reg_lambda=0.0, silent=False,\n",
       "        subsample=1.0, subsample_for_bin=200000, subsample_freq=0),\n",
       "       fit_params=None, iid='warn', n_jobs=-1,\n",
       "       param_grid={'num_leaves': range(50, 90, 10)},\n",
       "       pre_dispatch='2*n_jobs', refit=False, return_train_score='warn',\n",
       "       scoring='roc_auc', verbose=5)"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "         'objective': 'binary',#两类分类问题\n",
    "         'is_unbalance': True,\n",
    "         'n_jobs': -1,\n",
    "         'categorical_feature':[0,1,3,5,6,12,15,16,17,18,19,20],\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators':n_estimators_1,\n",
    "          'max_depth': 9,\n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "num_leaves_s = range(50,90,10) #50,60,70,80\n",
    "tuned_parameters = dict( num_leaves = num_leaves_s)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=-1, param_grid=tuned_parameters, cv = kfold, scoring=\"roc_auc\", verbose=5, refit = False)\n",
    "grid_search.fit(x_train , y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:41:21.888262Z",
     "start_time": "2020-07-01T08:41:21.883270Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.810521837856\n",
      "{'colsample_bytree': 0.2}\n"
     ]
    }
   ],
   "source": [
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:23:03.052090Z",
     "start_time": "2020-07-01T08:23:02.961336Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:125: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:125: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_search.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_search.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "n_leafs = len(num_leaves_s)\n",
    "import matplotlib.pyplot\n",
    "x_axis = num_leaves_s\n",
    "plt.plot(x_axis, -test_means)\n",
    "#plt.errorbar(x_axis, -test_means, yerr=test_stds,label = ' Test')\n",
    "#plt.errorbar(x_axis, -train_means, yerr=train_stds,label = ' Train')\n",
    "plt.xlabel( 'num_leaves' )\n",
    "plt.ylabel( 'Log Loss' )\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T05:55:48.591996Z",
     "start_time": "2020-07-01T05:55:48.582023Z"
    }
   },
   "source": [
    "max_depth= 9, num_leaves=70"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## min_child_samples "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:29:20.537445Z",
     "start_time": "2020-07-01T08:29:08.252585Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 4 candidates, totalling 20 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 12 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done   2 out of  20 | elapsed:    8.6s remaining:  1.3min\n",
      "[Parallel(n_jobs=-1)]: Done   7 out of  20 | elapsed:    9.1s remaining:   16.9s\n",
      "[Parallel(n_jobs=-1)]: Done  12 out of  20 | elapsed:    9.6s remaining:    6.4s\n",
      "[Parallel(n_jobs=-1)]: Done  17 out of  20 | elapsed:   12.1s remaining:    2.0s\n",
      "[Parallel(n_jobs=-1)]: Done  20 out of  20 | elapsed:   12.1s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=3, shuffle=True),\n",
       "       error_score='raise-deprecating',\n",
       "       estimator=LGBMClassifier(boosting_type='goss',\n",
       "        categorical_feature=[0, 1, 3, 5, 6, 12, 15, 16, 17, 18, 19, 20],\n",
       "        class_weight=None, colsample_bytree=0.7, importance_type='split',\n",
       "        is_unbalance=True, learning_rate=0.1, max_depth=9,\n",
       "        min_child_samples=20, min_child_weight=....0, reg_lambda=0.0, silent=False,\n",
       "        subsample=1.0, subsample_for_bin=200000, subsample_freq=0),\n",
       "       fit_params=None, iid='warn', n_jobs=-1,\n",
       "       param_grid={'min_child_samples': range(10, 50, 10)},\n",
       "       pre_dispatch='2*n_jobs', refit=False, return_train_score='warn',\n",
       "       scoring='roc_auc', verbose=5)"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "         'objective': 'binary',#两类分类问题\n",
    "         'is_unbalance': True,\n",
    "         'n_jobs': -1,\n",
    "         'categorical_feature':[0,1,3,5,6,12,15,16,17,18,19,20],\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators':n_estimators_1,\n",
    "          'max_depth': 9,\n",
    "          'num_leaves':70,\n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "min_child_samples_s = range(10,50,10) \n",
    "tuned_parameters = dict( min_child_samples = min_child_samples_s)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=-1,  param_grid=tuned_parameters, cv = kfold, scoring=\"roc_auc\", verbose=5, refit = False)\n",
    "grid_search.fit(x_train , y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:41:35.772864Z",
     "start_time": "2020-07-01T08:41:35.769903Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.810521837856\n",
      "{'colsample_bytree': 0.2}\n"
     ]
    }
   ],
   "source": [
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:29:55.588754Z",
     "start_time": "2020-07-01T08:29:55.508927Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:125: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:125: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_search.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_search.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "x_axis = min_child_samples_s\n",
    "\n",
    "plt.plot(x_axis, -test_means)\n",
    "#plt.errorbar(x_axis, -test_scores, yerr=test_stds ,label = ' Test')\n",
    "#plt.errorbar(x_axis, -train_scores, yerr=train_stds,label =  +' Train')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 微调min_child_samples"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:32:05.897158Z",
     "start_time": "2020-07-01T08:31:53.276907Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 8 candidates, totalling 40 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 12 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done  26 out of  40 | elapsed:   10.4s remaining:    5.6s\n",
      "[Parallel(n_jobs=-1)]: Done  35 out of  40 | elapsed:   11.2s remaining:    1.5s\n",
      "[Parallel(n_jobs=-1)]: Done  40 out of  40 | elapsed:   12.5s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=3, shuffle=True),\n",
       "       error_score='raise-deprecating',\n",
       "       estimator=LGBMClassifier(boosting_type='goss',\n",
       "        categorical_feature=[0, 1, 3, 5, 6, 12, 15, 16, 17, 18, 19, 20],\n",
       "        class_weight=None, colsample_bytree=0.7, importance_type='split',\n",
       "        is_unbalance=True, learning_rate=0.1, max_depth=9,\n",
       "        min_child_samples=20, min_child_weight=....0, reg_lambda=0.0, silent=False,\n",
       "        subsample=1.0, subsample_for_bin=200000, subsample_freq=0),\n",
       "       fit_params=None, iid='warn', n_jobs=-1,\n",
       "       param_grid={'min_child_samples': range(40, 120, 10)},\n",
       "       pre_dispatch='2*n_jobs', refit=False, return_train_score='warn',\n",
       "       scoring='roc_auc', verbose=5)"
      ]
     },
     "execution_count": 122,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "         'objective': 'binary',#两类分类问题\n",
    "         'is_unbalance': True,\n",
    "         'n_jobs': -1,\n",
    "         'categorical_feature':[0,1,3,5,6,12,15,16,17,18,19,20],\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators':n_estimators_1,\n",
    "          'max_depth': 9,\n",
    "          'num_leaves':70,\n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "min_child_samples_s = range(40,120,10) \n",
    "tuned_parameters = dict( min_child_samples = min_child_samples_s)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=-1,  param_grid=tuned_parameters, cv = kfold, scoring=\"roc_auc\", verbose=5, refit = False)\n",
    "grid_search.fit(x_train , y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:41:47.490521Z",
     "start_time": "2020-07-01T08:41:47.487522Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.810521837856\n",
      "{'colsample_bytree': 0.2}\n"
     ]
    }
   ],
   "source": [
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:32:24.346503Z",
     "start_time": "2020-07-01T08:32:24.265641Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:125: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:125: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_search.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_search.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "x_axis = min_child_samples_s\n",
    "\n",
    "plt.plot(x_axis, -test_means)\n",
    "#plt.errorbar(x_axis, -test_scores, yerr=test_stds ,label = ' Test')\n",
    "#plt.errorbar(x_axis, -train_scores, yerr=train_stds,label =  +' Train')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## colsample_bytree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:37:22.920676Z",
     "start_time": "2020-07-01T08:37:09.900725Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 5 candidates, totalling 25 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 12 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done   8 out of  25 | elapsed:    8.0s remaining:   17.2s\n",
      "[Parallel(n_jobs=-1)]: Done  14 out of  25 | elapsed:   11.2s remaining:    8.8s\n",
      "[Parallel(n_jobs=-1)]: Done  20 out of  25 | elapsed:   11.6s remaining:    2.8s\n",
      "[Parallel(n_jobs=-1)]: Done  25 out of  25 | elapsed:   12.9s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=3, shuffle=True),\n",
       "       error_score='raise-deprecating',\n",
       "       estimator=LGBMClassifier(boosting_type='goss',\n",
       "        categorical_feature=[0, 1, 3, 5, 6, 12, 15, 16, 17, 18, 19, 20],\n",
       "        class_weight=None, colsample_bytree=1.0, importance_type='split',\n",
       "        is_unbalance=True, learning_rate=0.1, max_depth=9,\n",
       "        min_child_samples=80, min_child_weight=....0, reg_lambda=0.0, silent=False,\n",
       "        subsample=1.0, subsample_for_bin=200000, subsample_freq=0),\n",
       "       fit_params=None, iid='warn', n_jobs=-1,\n",
       "       param_grid={'colsample_bytree': [0.5, 0.6, 0.7, 0.8, 0.9]},\n",
       "       pre_dispatch='2*n_jobs', refit=False, return_train_score=True,\n",
       "       scoring='roc_auc', verbose=5)"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "         'objective': 'binary',#两类分类问题\n",
    "         'is_unbalance': True,\n",
    "         'n_jobs': -1,\n",
    "         'categorical_feature':[0,1,3,5,6,12,15,16,17,18,19,20],\n",
    "         'learning_rate': 0.1,\n",
    "         'n_estimators': n_estimators_1,\n",
    "         'max_depth': 9,\n",
    "         'num_leaves': 70,\n",
    "         'min_child_samples': 80,\n",
    "         }\n",
    "lg = LGBMClassifier(silent = False, **params)\n",
    "\n",
    "colsample_bytree_s = [i / 10.0 for i in range(5, 10)]\n",
    "tuned_parameters = dict(colsample_bytree = colsample_bytree_s)\n",
    "\n",
    "grid_search = GridSearchCV(lg,\n",
    "                           n_jobs = -1,\n",
    "                           param_grid = tuned_parameters,\n",
    "                           cv = kfold,\n",
    "                           scoring = 'roc_auc',\n",
    "                           verbose = 5,\n",
    "                           refit = False,\n",
    "                           return_train_score = True)\n",
    "grid_search.fit(x_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:41:55.753197Z",
     "start_time": "2020-07-01T08:41:55.750204Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.810521837856\n",
      "{'colsample_bytree': 0.2}\n"
     ]
    }
   ],
   "source": [
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:38:31.507333Z",
     "start_time": "2020-07-01T08:38:31.504340Z"
    }
   },
   "source": [
    "## 微调colsample_bytree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:39:44.201491Z",
     "start_time": "2020-07-01T08:39:34.921871Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 4 candidates, totalling 20 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 12 concurrent workers.\n",
      "[Parallel(n_jobs=-1)]: Done   2 out of  20 | elapsed:    6.2s remaining:   56.3s\n",
      "[Parallel(n_jobs=-1)]: Done   7 out of  20 | elapsed:    6.6s remaining:   12.4s\n",
      "[Parallel(n_jobs=-1)]: Done  12 out of  20 | elapsed:    7.5s remaining:    5.0s\n",
      "[Parallel(n_jobs=-1)]: Done  17 out of  20 | elapsed:    9.0s remaining:    1.5s\n",
      "[Parallel(n_jobs=-1)]: Done  20 out of  20 | elapsed:    9.1s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=3, shuffle=True),\n",
       "       error_score='raise-deprecating',\n",
       "       estimator=LGBMClassifier(boosting_type='goss',\n",
       "        categorical_feature=[0, 1, 3, 5, 6, 12, 15, 16, 17, 18, 19, 20],\n",
       "        class_weight=None, colsample_bytree=1.0, importance_type='split',\n",
       "        is_unbalance=True, learning_rate=0.1, max_depth=9,\n",
       "        min_child_samples=80, min_child_weight=....0, reg_lambda=0.0, silent=False,\n",
       "        subsample=1.0, subsample_for_bin=200000, subsample_freq=0),\n",
       "       fit_params=None, iid='warn', n_jobs=-1,\n",
       "       param_grid={'colsample_bytree': [0.1, 0.2, 0.3, 0.4]},\n",
       "       pre_dispatch='2*n_jobs', refit=False, return_train_score=True,\n",
       "       scoring='roc_auc', verbose=5)"
      ]
     },
     "execution_count": 132,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "         'objective': 'binary',#两类分类问题\n",
    "         'is_unbalance': True,\n",
    "         'n_jobs': -1,\n",
    "         'categorical_feature':[0,1,3,5,6,12,15,16,17,18,19,20],\n",
    "         'learning_rate': 0.1,\n",
    "         'n_estimators': n_estimators_1,\n",
    "         'max_depth': 9,\n",
    "         'num_leaves': 70,\n",
    "         'min_child_samples': 80,\n",
    "         }\n",
    "lg = LGBMClassifier(silent = False, **params)\n",
    "\n",
    "colsample_bytree_s = [i / 10.0 for i in range(1, 5)]\n",
    "tuned_parameters = dict(colsample_bytree = colsample_bytree_s)\n",
    "\n",
    "grid_search = GridSearchCV(lg,\n",
    "                           n_jobs = -1,\n",
    "                           param_grid = tuned_parameters,\n",
    "                           cv = kfold,\n",
    "                           scoring = 'roc_auc',\n",
    "                           verbose = 5,\n",
    "                           refit = False,\n",
    "                           return_train_score = True)\n",
    "grid_search.fit(x_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:42:02.301161Z",
     "start_time": "2020-07-01T08:42:02.298196Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.810521837856\n",
      "{'colsample_bytree': 0.2}\n"
     ]
    }
   ],
   "source": [
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:42:29.202624Z",
     "start_time": "2020-07-01T08:42:29.123826Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_means = grid_search.cv_results_['mean_test_score']\n",
    "test_stds = grid_search.cv_results_['std_test_score']\n",
    "train_means = grid_search.cv_results_['mean_train_score']\n",
    "train_stds = grid_search.cv_results_['std_train_score']\n",
    "\n",
    "x_axis = colsample_bytree_s\n",
    "\n",
    "plt.plot(x_axis, -test_means)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "colsample_bytree  0.2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 降低学习率，重新调整n_estimators"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:47:07.149640Z",
     "start_time": "2020-07-01T08:46:49.881255Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\lightgbm\\basic.py:842: UserWarning: categorical_feature keyword has been found in `params` and will be ignored.\n",
      "Please use categorical_feature argument of the Dataset constructor to pass this parameter.\n",
      "  .format(key))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best n_estimators: 510\n",
      "best cv score: 0.844041675227\n"
     ]
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "         'objective': 'binary',#两类分类问题\n",
    "         'is_unbalance': True,\n",
    "         'n_jobs': -1,\n",
    "         'categorical_feature':[0,1,3,5,6,12,15,16,17,18,19,20],\n",
    "          'learning_rate': 0.01,\n",
    "          'max_depth': 9,\n",
    "          'num_leaves':70,\n",
    "          'min_child_samples':80,\n",
    "          'colsample_bytree': 0.2,\n",
    "         }\n",
    "n_estimators_2 = get_n_estimators(params , x_train , y_train, early_stopping_rounds = 50)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:48:12.375908Z",
     "start_time": "2020-07-01T08:48:12.371918Z"
    }
   },
   "source": [
    "## 用所有的训练数据在最优参数的基础上重新训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:50:43.587844Z",
     "start_time": "2020-07-01T08:50:40.470246Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\lightgbm\\basic.py:842: UserWarning: categorical_feature keyword has been found in `params` and will be ignored.\n",
      "Please use categorical_feature argument of the Dataset constructor to pass this parameter.\n",
      "  .format(key))\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "LGBMClassifier(boosting_type='goss',\n",
       "        categorical_feature=[0, 1, 3, 5, 6, 12, 15, 16, 17, 18, 19, 20],\n",
       "        class_weight=None, colsample_bytree=0.2, importance_type='split',\n",
       "        is_unbalance=True, learning_rate=0.01, max_depth=9,\n",
       "        min_child_samples=80, min_child_weight=0.001, min_split_gain=0.0,\n",
       "        n_estimators=510, n_jobs=-1, num_leaves=70, objective='binary',\n",
       "        random_state=None, reg_alpha=0.0, reg_lambda=0.0, silent=False,\n",
       "        subsample=1.0, subsample_for_bin=200000, subsample_freq=0)"
      ]
     },
     "execution_count": 143,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "         'objective': 'binary',#两类分类问题\n",
    "         'is_unbalance': True,\n",
    "         'n_jobs': -1,\n",
    "         'categorical_feature':[0,1,3,5,6,12,15,16,17,18,19,20],\n",
    "         'learning_rate': 0.01,\n",
    "         'n_estimators': n_estimators_2,\n",
    "         'max_depth': 9,\n",
    "         'num_leaves': 70,\n",
    "         'min_child_samples': 80,\n",
    "         'colsample_bytree': 0.2,\n",
    "         }\n",
    "lg = LGBMClassifier(silent = False, **params)\n",
    "lg.fit(x_train, y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 保存模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:52:18.174697Z",
     "start_time": "2020-07-01T08:52:17.988270Z"
    }
   },
   "outputs": [],
   "source": [
    "import pickle as pk\n",
    "pk.dump(lg, open(\"HappyBank_LightGBM_.pkl\", 'wb'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 对最终模型给出特征重要性（10分）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:57:54.128807Z",
     "start_time": "2020-07-01T08:57:54.121865Z"
    }
   },
   "outputs": [],
   "source": [
    "df = pd.DataFrame({\"columns\": list(feat_names), \"importance\": list(lg.feature_importances_.T)})\n",
    "df = df.sort_values(by = ['importance'], ascending = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-07-01T08:57:59.291153Z",
     "start_time": "2020-07-01T08:57:59.284171Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>columns</th>\n",
       "      <th>importance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>Lead_Creation_Date</td>\n",
       "      <td>3322</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>Monthly_Income</td>\n",
       "      <td>3076</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>Age</td>\n",
       "      <td>2456</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Existing_EMI</td>\n",
       "      <td>2320</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>Loan_Amount_Submitted</td>\n",
       "      <td>2146</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>EMI_Loan_Submitted</td>\n",
       "      <td>1889</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>Var5</td>\n",
       "      <td>1776</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Interest_Rate</td>\n",
       "      <td>1689</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Loan_Amount_Applied</td>\n",
       "      <td>1682</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>City</td>\n",
       "      <td>1670</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>Salary_Account</td>\n",
       "      <td>1585</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Loan_Tenure_Applied</td>\n",
       "      <td>1529</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>Processing_Fee</td>\n",
       "      <td>1086</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Employer_Name</td>\n",
       "      <td>1032</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>Source</td>\n",
       "      <td>1018</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>Var1</td>\n",
       "      <td>926</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>Loan_Tenure_Submitted</td>\n",
       "      <td>808</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>Var4</td>\n",
       "      <td>734</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>Var2</td>\n",
       "      <td>560</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Gender</td>\n",
       "      <td>512</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Filled_Form</td>\n",
       "      <td>424</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Device_Type</td>\n",
       "      <td>380</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>Mobile_Verified</td>\n",
       "      <td>352</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  columns  importance\n",
       "8      Lead_Creation_Date        3322\n",
       "14         Monthly_Income        3076\n",
       "22                    Age        2456\n",
       "4            Existing_EMI        2320\n",
       "10  Loan_Amount_Submitted        2146\n",
       "2      EMI_Loan_Submitted        1889\n",
       "21                   Var5        1776\n",
       "7           Interest_Rate        1689\n",
       "9     Loan_Amount_Applied        1682\n",
       "0                    City        1670\n",
       "16         Salary_Account        1585\n",
       "11    Loan_Tenure_Applied        1529\n",
       "15         Processing_Fee        1086\n",
       "3           Employer_Name        1032\n",
       "17                 Source        1018\n",
       "18                   Var1         926\n",
       "12  Loan_Tenure_Submitted         808\n",
       "20                   Var4         734\n",
       "19                   Var2         560\n",
       "6                  Gender         512\n",
       "5             Filled_Form         424\n",
       "1             Device_Type         380\n",
       "13        Mobile_Verified         352"
      ]
     },
     "execution_count": 147,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "hide_input": false,
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
